package com.sky.config;


import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import org.springdoc.core.GroupedOpenApi;
import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;

/**
 * @ClassName Knife4jConfig
 * @Description :类描述
 * @Author startno
 * @Date 2024/6/11 13:51
 * @Version 1.0
 */
@Configuration
public class Knife4jConfig {

    @Bean
    public GroupedOpenApi adminApi() {      // 创建了一个api接口的分组
        return GroupedOpenApi.builder()
                .group("admin-api")         // 分组名称
                .pathsToMatch("/admin/**")  // 接口请求路径规则
                .build();
    }

    /***
     * @description 自定义接口信息
     */
    @Bean
    public OpenAPI customOpenAPI() {

        return new OpenAPI().info(new Info()
                        .title("苍穹外卖项目API接口文档")
                        .description("苍穹外卖项目API接口文档")
                        .version("2.0")
                        .contact(new Contact().name("sky-task-out")))
                //下面配置为接口需要配置token才可以
                //.addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION))
                //.components(new Components()
                //        .addSecuritySchemes(HttpHeaders.AUTHORIZATION,
                //                new SecurityScheme()
                //                        .name(HttpHeaders.AUTHORIZATION)
                //                        .type(SecurityScheme.Type.HTTP)
                //                        .scheme("Bearer")
                //                        .in(SecurityScheme.In.HEADER)
                //                        .bearerFormat("JWT")
                //        )
                //);
                ;
    }


    /**
     * 全局自定义扩展
     * <p>
     * 在OpenAPI规范中，Operation 是一个表示 API 端点（Endpoint）或操作的对象。
     * 每个路径（Path）对象可以包含一个或多个 Operation 对象，用于描述与该路径相关联的不同 HTTP 方法（例如 GET、POST、PUT 等）。
     */
    @Bean
    public GlobalOpenApiCustomizer globalOpenApiCustomizer() {
        return openApi -> {
            // 全局添加鉴权参数
            if (openApi.getPaths() != null) {
                openApi.getPaths().forEach((s, pathItem) -> {
                    // 登录接口/验证码不需要添加鉴权参数
                    if (s.equals("/admin/system/index/login") || s.equals("/admin/system/index/generateValidateCode") ||s.equals("/admin/manager/index/getToken") ) {
                        return;
                    }
                    // 接口添加鉴权参数
                    pathItem.readOperations()
                            .forEach(operation ->
                                    operation.addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION))
                            );
                });
            }
        };
    }



}
